package com.huangyi.adminservice.house.service.strategy;

import com.huangyi.adminapi.house.domain.dto.SearchHouseListReqDTO;
import com.huangyi.adminservice.house.domain.dto.HouseDTO;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 价格排序策略实现类
 * 
 * <p>根据房源价格进行升序或降序排序，采用单例模式提供实例
 * 
 * @author huangyi
 * @version 1.0
 * @since 2024
 */
public class PriceSortStrategy implements ISortStrategy {

    /** 是否升序排序 */
    private final boolean asc;
    
    /** 升序排序单例实例 */
    private final static PriceSortStrategy ASC_INSTANCE = new PriceSortStrategy(true);
    
    /** 降序排序单例实例 */
    private final static PriceSortStrategy DESC_INSTANCE = new PriceSortStrategy(false);

    /**
     * 私有构造函数
     * 
     * @param asc 是否升序排序
     */
    private PriceSortStrategy(boolean asc) {
        this.asc = asc;
    }

    /**
     * 获取排序策略实例
     * 
     * @param asc 是否升序排序
     * @return 排序策略实例
     */
    public static PriceSortStrategy getInstance(boolean asc) {
        return asc ? ASC_INSTANCE : DESC_INSTANCE;
    }

    /**
     * 对房源列表按价格进行排序
     * 
     * @param houseDTOList 待排序的房源列表
     * @param reqDTO 搜索请求参数（此实现中未使用）
     * @return 按价格排序后的房源列表
     */
    @Override
    public List<HouseDTO> sort(List<HouseDTO> houseDTOList, SearchHouseListReqDTO reqDTO) {
        if (asc) {
            return houseDTOList.stream()
                    .sorted(Comparator.comparingDouble(HouseDTO::getPrice))
                    .collect(Collectors.toList());
        } else {
            return houseDTOList.stream()
                    .sorted(Comparator.comparingDouble(HouseDTO::getPrice).reversed())
                    .collect(Collectors.toList());
        }
    }
}
